#pragma once
// 131219: chang to c++ class;
// use method: create object, then use, need not init;

#define HASHSIZE 101

typedef struct hashlist_s
{
	hashlist_s * pre;
	hashlist_s *next;
	string		name;
	void *		addr;
}hashlist_t;
// struct hashlist_s ;

class LHash : public LObj
{
public:
	LHash();
	~LHash();


	bool	add( void * addr );
	bool	add( string name, void * addr);
	void *	find(string s );
	void * find( int idx);
	
	void	del( string s );
	void	del( void * addr );

	void setOverwrite( bool b ) { moverwrite = b; }
	int getSize() { return HASHSIZE; }
private:
	int init();
	void exit();

	bool moverwrite;	// overwrite then exist;
	bool isOverwrite() { return moverwrite; }

	char mchar[256];	// 260;
	hashlist_t * hashtab[HASHSIZE];
	hashlist_t * getHlist( int idx ) { return hashtab[idx]; }
	unsigned int calhash(string str );
	hashlist_t * lookupn(string s );
	hashlist_t * lookupa(void * addr );
	hashlist_t *  create( hashlist_t * pre, hashlist_t * next, string name, void * addr );
	void delHs( hashlist_t * hs );
	void delall();
};

extern LHash * ghash;